/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.upc.dai.grupovictor.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import pe.edu.upc.dai.grupovictor.dao.SistemaEvaluacionDao;
import pe.edu.upc.dai.grupovictor.dao.util.ConnectionUtils;
import pe.edu.upc.dai.grupovictor.dao.util.DaoException;
import pe.edu.upc.dai.grupovictor.model.Ciclo;
import pe.edu.upc.dai.grupovictor.model.Curso;
import pe.edu.upc.dai.grupovictor.model.SistemaEvaluacion;

public class SistemaEvaluacionDaoImpl implements SistemaEvaluacionDao {

    public SistemaEvaluacion seleccionarPorPrimaryKey(Long idSistemaEvaluacion) {
        Connection connection = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        SistemaEvaluacion sistemaEvaluacion = null;
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement(""
                    + "select se.id_sistema_evaluacion,se.estado, "
                    + "       cu.id_curso,cu.codigo_curso,cu.nombre_curso, "
                    + "       ci.id_ciclo,ci.codigo_externo,ci.nombre_ciclo "
                    + "from sistema_evaluacion se "
                    + "left join ciclo ci on se.id_ciclo = ci.id_ciclo "
                    + "left join curso cu on se.id_curso = cu.id_curso "
                    + "where se.id_sistema_evaluacion = ? ");
            st.setLong(1, idSistemaEvaluacion);
            rs = st.executeQuery();
            if (rs.next()) {
                Ciclo ciclo = new Ciclo();
                ciclo.setCodigoExterno(rs.getString("CODIGO_EXTERNO"));
                ciclo.setIdCiclo(rs.getLong("ID_CICLO"));
                ciclo.setNombreCiclo(rs.getString("NOMBRE_CICLO"));

                Curso curso = new Curso();
                curso.setCodigoCurso(rs.getString("CODIGO_CURSO"));
                curso.setIdCurso(rs.getLong("ID_CURSO"));
                curso.setNombreCurso(rs.getString("NOMBRE_CURSO"));

                sistemaEvaluacion = new SistemaEvaluacion();
                sistemaEvaluacion.setEstado(rs.getString("ESTADO"));
                sistemaEvaluacion.setIdSistemaEvaluacion(rs.getLong("ID_SISTEMA_EVALUACION"));
                sistemaEvaluacion.setIdCiclo(ciclo);
                sistemaEvaluacion.setIdCurso(curso);
            }
        } catch (SQLException e) {
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
        return sistemaEvaluacion;
    }

    public Long getIdSiguiente() {
        Connection connection = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        Long id = null;

        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement(""
                    + "select max(se.id_sistema_evaluacion)+1 id "
                    + "from sistema_evaluacion se ");
            rs = st.executeQuery();
            if (rs.next()) {
                id = rs.getLong("ID");
            }
        } catch (SQLException e) {
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
        return id;
    }

    public SistemaEvaluacion seleccionarPorNombre(String nombre) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void insertar(SistemaEvaluacion sistemaEvaluacion) {
        Long id = getIdSiguiente();
        sistemaEvaluacion.setIdSistemaEvaluacion(id);

        Connection connection = null;
        PreparedStatement st = null;
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement("INSERT INTO SISTEMA_EVALUACION(ID_SISTEMA_EVALUACION,ID_CICLO,ID_CURSO,ESTADO) VALUES(?,?,?,?)");
            st.setLong(1, sistemaEvaluacion.getIdSistemaEvaluacion());
            st.setLong(2, sistemaEvaluacion.getIdCiclo().getIdCiclo());
            st.setLong(3, sistemaEvaluacion.getIdCurso().getIdCurso());
            st.setString(4, sistemaEvaluacion.getEstado());
            st.execute();
            ConnectionUtils.commit(connection);
        } catch (SQLException e) {
            ConnectionUtils.rollback(connection);
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
    }

    public void actualizar(SistemaEvaluacion sistemaEvaluacion) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void eliminar(SistemaEvaluacion sistemaEvaluacion) {
        Connection connection = null;
        PreparedStatement st = null;
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement("DELETE SISTEMA_EVALUACION SE WHERE SE.ID_SISTEMA_EVALUACION = ?");
            st.setLong(1, sistemaEvaluacion.getIdSistemaEvaluacion());
            st.execute();
            ConnectionUtils.commit(connection);
        } catch (SQLException e) {
            ConnectionUtils.rollback(connection);
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
    }

    public List<SistemaEvaluacion> seleccionarTodos() {
        Connection connection = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        SistemaEvaluacion sistemaEvaluacion = null;
        List<SistemaEvaluacion> lista = new ArrayList<SistemaEvaluacion>();
        try {
            connection = ConnectionUtils.getConnection();
            st = connection.prepareStatement(""
                    + "select se.id_sistema_evaluacion,se.estado, "
                    + "       cu.id_curso,cu.codigo_curso,cu.nombre_curso, "
                    + "       ci.id_ciclo,ci.codigo_externo,ci.nombre_ciclo "
                    + "from sistema_evaluacion se "
                    + "left join ciclo ci on se.id_ciclo = ci.id_ciclo "
                    + "left join curso cu on se.id_curso = cu.id_curso ");

            rs = st.executeQuery();
            while (rs.next()) {
                sistemaEvaluacion = mapResultSet(rs);
                lista.add(sistemaEvaluacion);
            }
        } catch (SQLException e) {
            throw new DaoException(e);
        } finally {
            ConnectionUtils.closeResultSet(rs);
            ConnectionUtils.closeStatement(st);
            ConnectionUtils.closeConnection(connection);
        }
        return lista;
    }

    private SistemaEvaluacion mapResultSet(ResultSet rs) throws SQLException {
        Ciclo ciclo = new Ciclo();
        ciclo.setCodigoExterno(rs.getString("CODIGO_EXTERNO"));
        ciclo.setIdCiclo(rs.getLong("ID_CICLO"));
        ciclo.setNombreCiclo(rs.getString("NOMBRE_CICLO"));

        Curso curso = new Curso();
        curso.setCodigoCurso(rs.getString("CODIGO_CURSO"));
        curso.setIdCurso(rs.getLong("ID_CURSO"));
        curso.setNombreCurso(rs.getString("NOMBRE_CURSO"));

        SistemaEvaluacion sistemaEvaluacion = new SistemaEvaluacion();
        sistemaEvaluacion.setEstado(rs.getString("ESTADO"));
        sistemaEvaluacion.setIdSistemaEvaluacion(rs.getLong("ID_SISTEMA_EVALUACION"));
        sistemaEvaluacion.setIdCiclo(ciclo);
        sistemaEvaluacion.setIdCurso(curso);

        return sistemaEvaluacion;
    }
}
